package com.stone.boot.file.infra.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import com.stone.boot.file.config.property.AliyunOssBaseProperty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

/**
 * 文件上传工具类
 *
 * @author Mr_wenpan@163.com 2021/8/19 3:02 下午
 */
@Slf4j
@Component
public class FileUploadUtil {

    @Autowired
    private AliyunOssBaseProperty aliyunOssBaseProperty;

    public String upload(MultipartFile file, String fileName) {
        OSS ossClient = null;
        // 写入文件
        try {
            //获取上传的输入流
            InputStream inputStream = file.getInputStream();
            // 设置访问地址是默认是预览图片
            ObjectMetadata meta = new ObjectMetadata();
            meta.setContentType("image/jpg");

            // 创建OSSClient实例
            ossClient = new OSSClientBuilder().build(aliyunOssBaseProperty.getEndpoint(),
                    aliyunOssBaseProperty.getAccessKeyId(), aliyunOssBaseProperty.getAccessKeySecret());
            // ===================================================================================================
            // 调用oss上传到阿里云对象存储oss----Bucket存储空间
            // 第一个参数 bucket名称
            // 第二个参数 文件名称
            // 第三个参数 输入流
            // 第四个参数 文件类型
            // ===================================================================================================
            ossClient.putObject(aliyunOssBaseProperty.getBucketName(), fileName, inputStream, meta);

            // 删除文件。如需删除文件夹，请将ObjectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有object删除后才能删除该文件夹。
            //ossClient.deleteObject(bucketName, "a/");

            //上传成功后获取文件路径
            return "https://" + aliyunOssBaseProperty.getBucketName() + "." + aliyunOssBaseProperty.getEndpoint() + "/" + fileName;
        } catch (IOException e) {
            throw new RuntimeException("文件上传出错，请稍后再试.");
        } finally {
            // 关闭OSSClient
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}